package com.sxu.aicodehelper.ai;

import com.sxu.aicodehelper.ai.tools.InterviewQuestionTool;
import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.service.AiServices;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiCodeHelperServiceFactory {

    // 引入大模型
    @Resource
    private ChatModel myQwenChatModel;

    // 引入RAG
    @Resource
    private ContentRetriever contentRetriever;

    // 引入MCP
    @Resource
    private McpToolProvider mcpToolProvider;

    // 引入流式对话模型
    @Resource
    private StreamingChatModel qwenStreamingChatModel;

    @Bean
    public AICodeHelperService aiCodeHelperService() {

        /**
         * 通过MessageWindowChatMemory的withMaxMessages方法创建会话记忆
         * ChatMemory是一个接口
         * 参数：
         *  每个用户最多保存的消息数量
         */
        ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

        /**
         * 调用AiServices.builder方法创建出AI Service的实现类
         *
         * 参数：
         *  1. AI Service的接口类别
         */
        AICodeHelperService aiCodeHelperService = AiServices.builder(AICodeHelperService.class)
                .chatModel(myQwenChatModel) // Ai大模型
                .streamingChatModel(qwenStreamingChatModel) // 流式对话模型
                .chatMemory(chatMemory)  // 会话记忆
                .chatMemoryProvider(memoryId ->MessageWindowChatMemory.withMaxMessages(10)) // 每个会话独立存储
                .contentRetriever(contentRetriever) // 使用RAG
                .tools(new InterviewQuestionTool()) // 引入工具
                .toolProvider(mcpToolProvider) // 从工具提供器中自动加载工具
                .build();
        return aiCodeHelperService;

//        /**
//         * 调用AiServices.create方法创建出AI Service的实现类
//         *
//         * 参数：
//         *  1. AI Service的接口类别
//         *  2. 使用的大模型
//         */
//        return AiServices.create(AICodeHelperService.class, qwenChatModel);
    }
}
